package cn.zqy.demo2.day02.demo02;


import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 泛型的通配符:
 *         ?:代表任意的数据类型
 *     使用方式:
 *         不能创建对象使用
 *         【只能】作为方法的参数使用
 *
 *      泛型的上限限定: ? extends E  代表使用的泛型只能是E类型的子类/本身
 *      泛型的下限限定: ? super E    代表使用的泛型只能是E类型的父类/本身
 * */
public class Demo05Wildcard {
    public static void main(String[] args) {
        ArrayList<String> li1 = new ArrayList<>();
        li1.add("aaa");
        li1.add("bbb");
        li1.add("ccc");

        ArrayList<Integer> li2 = new ArrayList<>();
        li2.add(1);
        li2.add(2);
        li2.add(3);
        li2.add(4);

        printArr(li1);
        printArr(li2);
        System.out.println("\n" + "================");
        printA(li1);
        printA(li2);
        System.out.println("\n" + "================");
        limitGeneric();
    }

    // 调用含有泛型的方法
    public static <E> void printArr(ArrayList<E> li) {
        Iterator<E> ll = li.iterator();
        while (ll.hasNext()) {
            E next = ll.next();
            System.out.print(next + "  ");
        }
    }
    // 使用泛型通配符
    public static void printA(ArrayList<?> li) {
        Iterator<?> ll  = li.iterator();
        //ll.next()方法,取出的元素是Object,可以接收任意的数据类型
        while (ll.hasNext()) {
            Object e = ll.next();
            System.out.print(e + "  ");
        }
    }

    public static void limitGeneric() {
        ArrayList<String> li1 = new ArrayList<>();
        ArrayList<Integer> li2 = new ArrayList<>();
        ArrayList<Number> li3 = new ArrayList<>();
        ArrayList<Object> li4 = new ArrayList<>();

        System.out.println("泛型上下限。。。");
        // getElement1(li1);   //报错
        getElement1(li2);
        getElement1(li3);
        // getElement1(li4);   //报错

        // getElement2(li1);   //报错
        // getElement2(li2);   //报错
        getElement2(li3);
        getElement2(li4);

    }

    // 泛型的上限：此时的泛型?，必须是Number类型或者Number类型的子类
    public static void getElement1(Collection<? extends Number> coll){}
    // 泛型的下限：此时的泛型?，必须是Number类型或者Number类型的父类
    public static void getElement2(Collection<? super Number> coll){}
}
